package excel.exp;//package cn.xueden.common.core.excel.exp;
//
//
//import cn.xueden.common.core.context.ContextHolder;
//import cn.xueden.common.core.context.RequestContext;
//import cn.xueden.common.core.context.TaskContext;
//import cn.xueden.common.core.excel.task.AbstractDefaultTask;
//import cn.xueden.common.core.excel.task.TaskVO;
//import com.alibaba.fastjson.JSON;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.collections4.CollectionUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.core.io.ClassPathResource;
//import org.springframework.stereotype.Component;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.InputStream;
//import java.io.Serializable;
//import java.nio.file.Files;
//import java.util.Collections;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//
//@Slf4j
//@Component
//public abstract class ExportTemple<T extends Serializable, Q extends BasePageQry>
//    extends AbstractDefaultTask<String, ExcelExpReq> {
//
//    protected static final ThreadLocal<Map<String, Object>> threadLocal = new ThreadLocal<>();
//
//    private static final String TASK = "task";
//
//    @Autowired
//    private ExpTypeConfig config;
//
//    @Override
//    @SuppressWarnings("unchecked")
//    public String execute(ExcelExpReq req) {
//        ExpType expType = config.getTypeMap().get(req.getType());
//        Long taskId = req.getId();
//        TaskVO<Q> taskVO = new TaskVO<>();
//        taskVO.setTaskId(taskId);
//        taskVO.setTaskName(expType.getTaskName() + "_" + taskId);
//        taskVO.setSerialNo(expType.getSerialNo() + "_" + taskId);
//        taskVO.setBizType(expType.getBizType());
//        taskVO.setTaskSource(expType.getTaskSource());
//        String taskName = taskVO.getTaskName();
//        RequestContext context = ContextHolder.get();
//        TaskContext tc = new TaskContext(context, taskVO);
//        Map<String, Object> map = new HashMap<>();
//        map.put(TASK, taskVO);
//        threadLocal.set(map);
//        // 开始导出
//        working(tc);
//        String upLoadUrl = null;
//        File file = null;
//        ExcelWriter excelWriter = null;
//        try {
//            StringBuilder fileRootDir =
//                new StringBuilder(FileConstant.SAVE_PATH).append(File.separator).append("excel").append(File.separator)
//                    .append("export").append(File.separator).append(expType.getTaskName()).append(File.separator);
//            File fileDir = new File(fileRootDir.toString());
//            if (!fileDir.exists() && !fileDir.mkdirs()) {
//                log.error("任务：{}，创建文件夹{}失败", taskName, fileRootDir);
//                throw new BizException(Constants.MSG_BIZ_FAIL);
//            }
//            String filePath = fileRootDir.append(taskName).append(".xlsx").toString();
//            if (req.getTemplateName() == null) {
//                file = new File(filePath);
//                if (!file.exists() && !file.createNewFile()) {
//                    log.error("任务：{}，创建文件{}失败", taskName, filePath);
//                    throw new BizException(Constants.MSG_BIZ_FAIL);
//                }
//                // 创建ExcelWriter对象
//                Class<?> aClass = ClassUtil.getActualTypeArgument(this.getClass());
//                excelWriter = EasyExcel.write(filePath).build();
//
//                ExcelWriterSheetBuilder sheetBuilder = EasyExcel.writerSheet(0, taskName);
//                Q qry;
//                Class<?> qClass = ClassUtil.getActualTypeArgument(this.getClass(), 1);
//                if (StrUtil.isBlank(req.getQry())) {
//                    qry = (Q)qClass.newInstance();
//                } else {
//                    qry = (Q)JSON.parseObject(req.getQry(), qClass);
//                }
//                List<List<String>> head = createHead(new ExpHeadDTO<>(qry, taskVO));
//                if (CollUtil.isNotEmpty(head)) {
//                    sheetBuilder.head(head);
//                } else {
//                    sheetBuilder.head(aClass);
//                }
//                WriteSheet writeSheet = sheetBuilder.build();
//
//                // 获取全部数据
//                Integer pageNo = 1;
//                do {
//                    qry.setPageNo(pageNo);
//                    qry.setPageSize(config.getBatchCount());
//                    List<T> dtoList = pageData(qry);
//                    if (CollectionUtils.isEmpty(dtoList)) {
//                        /* 生成完毕 */
//                        excelWriter.finish();
//                        break;
//                    }
//                    excelWriter.write(dtoList, writeSheet);
//                    pageNo++;
//                    // 死循环 获取全部
//                } while (true);
//            } else {
//                // 创建ExcelWriter对象
//                InputStream inputStream =
//                    new ClassPathResource("export/template/" + req.getTemplateName()).getInputStream();
//                excelWriter = EasyExcel.write(filePath).withTemplate(inputStream).build();
//                WriteSheet writeSheet = EasyExcel.writerSheet().build();
//                Q qry;
//                Class<?> qClass = ClassUtil.getActualTypeArgument(this.getClass(), 1);
//                if (StrUtil.isBlank(req.getQry())) {
//                    qry = (Q)qClass.newInstance();
//                } else {
//                    qry = (Q)JSON.parseObject(req.getQry(), qClass);
//                }
//                FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build();
//                Integer pageNo = 1;
//                do {
//                    if (pageNo == 1) {
//                        excelWriter.fill(paramMap(qry), writeSheet);
//                    }
//                    qry.setPageNo(pageNo);
//                    qry.setPageSize(config.getBatchCount());
//                    List<T> dtoList = pageData(qry);
//                    if (CollectionUtils.isEmpty(dtoList)) {
//                        /* 生成完毕 */
//                        excelWriter.finish();
//                        break;
//                    }
//                    excelWriter.fill(dtoList, fillConfig, writeSheet);
//                    pageNo++;
//                    // 死循环 获取全部
//                } while (true);
//            }
//
//            log.info("开始导出:{}", taskName);
//            taskDetail(taskId, "本地文件已经写入,等待上传文件");
//            // 上传文件
//            try {
//                //阿里云返回url
//                upLoadUrl = OssUpload.upload(filePath, taskName);
//                success(tc, "成功", upLoadUrl);
//            } catch (Exception e1) {
//                log.error("上传到阿里云中发生错误", e1);
//                fail(tc, "写入过程中发生错误");
//            }
//        } catch (Exception e) {
//            log.error("导出过程出现错误:{0}", e);
//            fail(tc, "导出过程出现错误,详情查看日志");
//        } finally {
//            threadLocal.remove();
//            if (excelWriter != null) {
//                excelWriter.finish();
//            }
//            if (file != null) {
//                try {
//                    Files.delete(file.toPath());
//                } catch (IOException e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//        return upLoadUrl;
//    }
//
//    /**
//     * 自定义导出excel时生成表头
//     *
//     * @param dto 导出excel时生成表头DTO
//     * @return List<List < String>>
//     * @author Gxr
//     * @since 2024/4/29 17:52
//     */
//    public List<List<String>> createHead(ExpHeadDTO<Q> dto) {
//        return Collections.emptyList();
//    }
//
//    /**
//     * 滚动查询需要导出的数据
//     *
//     * @param qry 滚动查询条件
//     * @return List<T>
//     * @author Gxr
//     * @since 2024/4/29 17:52
//     */
//    public abstract List<T> pageData(Q qry);
//
//    public Map<String, String> paramMap(Q qry) {
//        return new HashMap<>();
//    }
//
//}
